/**
 * 循环：语言层面上的语法 -> 重复执行一段程序的方案
 * 遍历：业务层面上的做法 -> 观察或者获取集合中的元素的一种做法
 * 迭代：实现层面上的概念 -> 实现遍历的底层方案其实就是迭代
 */

const arr = [1, 2, 3];

// 循环
// for (let i = 0; i < arr.length; i++) {
//   console.log(i, arr[i]); // 重复执行一段程序
// }

// 遍历
// es5之前没有针对可迭代的对象的具体的遍历方法
// es5新增了7个
// filter reduce reduceRight map forEach some every

// 迭代(需要迭代器)
// for...of  的迭代器是Symbol.iterator
// Array  TypedArray  String Map Set  都是有Symbol.iterator

// 生成器generator
// function generator(arr) {
//   let nextIndex = 0;
//   return {
//     next() {
//       return nextIndex < arr.length
//         ? { value: arr[nextIndex++], done: false }
//         : { value: undefined, done: true };
//     },
//   };
// }
// const arrG = generator(arr);
// console.log(arrG.next());
// console.log(arrG.next());
// console.log(arrG.next());
// console.log(arrG.next());

// 可以给对象自定义Symbol.iterator
function iterator() {
  var index = 0;
  var _this = this;
  return {
    next() {
      return index < _this.length
        ? { value: _this[index++], done: false }
        : { value: undefined, done: true };
    },
  };
}

// 没有迭代器
const obj = {
  0: 1,
  1: 2,
  2: 3,
  length: 3,
};
// 添加自定义的迭代器
Object.prototype[Symbol.iterator] = iterator;

for (let i of obj) {
  console.log(i);
}

const selectAll = document.querySelectorAll("div");
const divList = document.getElementsByTagName("div");
console.log(selectAll);
console.log(divList);
